//--------------VARIABLES GLOBALES----------------//

 var repositorioMaterialParedes = []; //almacena los tipos de paredes
 
 var TIPO_PARED_LADRILLO_SANA = "paredLadrilloSana";
 var TIPO_PARED_DEFAULT = "paredLadrilloSana";
 
 var paredes = [];
 var cantColumnas = 0;
 var anchoTotal = 0;
  
//--------------fin VARIABLES GLOBALES----------------//
 
  
 function paredonBuilder(){
	 
	 this.insertarPared = insertarPared;

	 //parametros
	 // <escena> : indica la escena en la que se insertara la pared. si no existe se retorna false
	 // <tipoPared> : indica el tipo de pared a insertar
	 // <img> : indica la imagen a insertar en la pared //TODO
	  function insertarPared(publicacion, parametros) {

		if (!parametros.escena)
			return false;

		var scene = parametros.escena;
		var tipo = parametros.tipoPared || TIPO_PARED_DEFAULT;
		var shaderOn = parametros.shaderOn || bumpMapOn;
		var img = parametros.img || null;

		var texto = publicacion.data.message;
		var materialPared = null;
		var materialTexto = null;

		switch (tipo) {
			case "paredLadrilloSana":
		
				if (!repositorioMaterialParedes["paredLadrilloSana"]) {
		
					repositorioMaterialParedes["paredLadrilloSana"] = [];
					MATERIAL_BUILDER.crearMaterial("paredLadrilloSana");
				}
		
				if (texto)
					materialTexto = MATERIAL_BUILDER.crearMaterialTexto(publicacion,
							"obj/_pared/Map__1_Normal Bump.png",img);
		
				if (shaderOn)
					materialPared = repositorioMaterialParedes["paredLadrilloSana"].materialShader;
		
				break;
			default:
				alert("error al crear la pared. el tipo de pared no es valido");
				return;
		}

		publicacion.mesh = [];
		if (materialTexto.length) {
			for ( var i = 0; i < materialTexto.length; i++) {
				var mesh = new THREE.Mesh(loaded.geometries["pared_sana_sola"], [materialPared, materialTexto[i] ] /* material1 */);
				publicacion.mesh.push(mesh);
			}
		} else {
			var mesh = new THREE.Mesh(loaded.geometries["pared_sana_sola"],[ materialPared ] /* material1 */);
			publicacion.mesh.push(mesh);
		}

		agregarParedAEscena(scene, publicacion);

	}
		
		
		
		function agregarParedAEscena( scene, publicacion){
			
			var grupoParedes = new THREE.Object3D();
			
			var anchoColumna = loaded.geometries["columna_sana_sola"].ancho();
			
			//insertamos la primera columna
			if (cantColumnas == 0){
				var primerColumna = MESH_BUILDER.crearColumna();
				
				primerColumna.translateX(anchoColumna*0.5); //inicialmente la columna esta centrada en el origen
				primerColumna.updateMatrix();
				
				if (techitoColumnaBool){
					primerColumna.addChild(MESH_BUILDER.crearColumnaTechito());
				}
				if (rellenoCalle){
					var primerRellonoColumna = MESH_BUILDER.crearRellenoColumna();
					primerColumna.addChild(primerRellonoColumna);
				}
				
				scene.addObject(primerColumna);
				cantColumnas++;
				
			}
			
			grupoParedes.translateX(anchoColumna*cantColumnas + publicacion.mesh[0].geometry.ancho()* (0.5 + paredes.length) );
			
			for (var i = 0; i < publicacion.mesh.length; i++){
				var pared = publicacion.mesh[i];
				//si queremos columnas
					
					pared.translateX(  (i)*pared.geometry.ancho()  );
				
				
				if (techitoParedBool){
					pared.addChild(MESH_BUILDER.crearParedTechito());
				}
				//relleno
				if (rellenoCalle){
				var relleno = MESH_BUILDER.crearRelleno();
				pared.addChild(relleno);
				}
				
				//insertamos la pared
				pared.updateMatrix();
				grupoParedes.addChild(pared);
				
				paredes.push(pared);
				
			}
			
			scene.addObject(grupoParedes);
			
			var persona;
			if (publicacion.user.gender == "female" ){
				persona = MESH_BUILDER.crearMujer();
			}
			else {
				persona = MESH_BUILDER.crearHombre();
			}
			//mano.rotation = new THREE.Vector3(Math.PI/2,0,0);
			var centrarX = -publicacion.mesh[0].geometry.ancho()/2; 
			centrarX += publicacion.mesh[0].geometry.ancho()*publicacion.proporcionAnchoNombre*publicacion.mesh.length/2; 
			centrarX += publicacion.mesh[0].geometry.ancho()*publicacion.mesh.length/2; 
			centrarX += persona.geometry.ancho()/1.5; 
			persona.translateX(centrarX);
			persona.translateY(persona.geometry.alto()/2);
			persona.translateZ(publicacion.mesh[0].geometry.profundidad()/2);
			persona.scale = new THREE.Vector3(0.8,0.8,1);
			grupoParedes.addChild(persona);
			
			
			
			//insertamos la proxima columna
			if (columnasBool){
				var nuevaColumna = MESH_BUILDER.crearColumna();
				
				nuevaColumna.translateX(anchoColumna*cantColumnas + anchoColumna* 0.5 + paredes.length * publicacion.mesh[0].geometry.ancho() );
				nuevaColumna.updateMatrix();
				
				if (techitoColumnaBool){
					nuevaColumna.addChild(MESH_BUILDER.crearColumnaTechito());
				}
				if (rellenoCalle){
					var rellenoColumna = MESH_BUILDER.crearRellenoColumna();
					nuevaColumna.addChild(rellenoColumna);
				}
				
				scene.addObject(nuevaColumna);
				cantColumnas++;
				
				anchoTotal = anchoColumna*cantColumnas + anchoColumna* 0.5 + paredes.length * publicacion.mesh[0].geometry.ancho() ;
			}
			
			
			
			
			//-------------- Facebook: "me gusta" y "comentarios"----------------//
			var anchoTotalParedon = publicacion.mesh[0].geometry.ancho()*publicacion.mesh.length;//ya no es el ancho de una sola pared (agregue la posibilidad de escribir en mas de 1 pared si el texto es demasiado extenso)
			
			var grupoDataFacebook = new THREE.Object3D();//en este objeto agrupo: cant Likes + icono Like + cant Comentarios + icono Comentario
			
			//manito "me gusta" logo 3D
			var mano = MESH_BUILDER.crearManoMeGusta();
			
			//texto3D (cantidad "me gusta")
			var mano_texto3D = MESH_BUILDER.getTexto3D((publicacion.data.likes) ? publicacion.data.likes.count : "0");//TODO
			
			//comentarios logo 3D
			var comentario = MESH_BUILDER.crearComentario();
			
			//texto3D (cantidad "comentarios")
			var comentario_texto3D = MESH_BUILDER.getTexto3D(publicacion.data.comments.count);
			
			
			
			
			var separacion = 5;
			var separacionGrupos = 5;
			var distanciaSupPared = 20;
			
			//conjunto: "me gusta" + "cantidad me gusta"
			mano.addChild(mano_texto3D);
			mano.scale = new THREE.Vector3( 0.4, 0.4, 0.4 );
			
			mano_texto3D.scale = new THREE.Vector3(1/(mano_texto3D.parent.scale.x)/2, 1/(mano_texto3D.parent.scale.x)/2, 1/(mano_texto3D.parent.scale.x)/2 );
			mano_texto3D.translateX((-mano.geometry.ancho()/2 - mano_texto3D.ancho()/2 - separacion));
			mano_texto3D.translateZ((mano.alto()));//ver
			mano_texto3D.translateY((-mano_texto3D.geometry.profundidad/2));
			mano_texto3D.updateMatrix();
			
			mano.anchoTotal = (mano.ancho() + (mano_texto3D.ancho()*mano.scale.x)+ separacion);
			
			mano.meshCantidad = mano_texto3D;
			mano.cantidad = (publicacion.data.likes) ? publicacion.data.likes.count : 0;
			
			//funcion que actualiza el valor de la cantidad de "me gusta"
			mano.actualizarCantidad = function(cantidad){
				
				mano.cantidad = mano.cantidad + cantidad;
				
				scene.removeChild (mano.meshCantidad);
				
				mano.meshCantidad = MESH_BUILDER.getTexto3D(mano.cantidad);
				mano.addChild(mano.meshCantidad);
				
				
				mano.meshCantidad.scale = new THREE.Vector3(1/(mano.meshCantidad.parent.scale.x)/2, 1/(mano.meshCantidad.parent.scale.x)/2, 1/(mano.meshCantidad.parent.scale.x)/2 );
				mano.meshCantidad.translateX((-mano.geometry.ancho()/2 - mano.meshCantidad.ancho()/2 - separacion));
				mano.meshCantidad.translateZ((mano.alto()));//ver
				mano.meshCantidad.translateY((-mano.meshCantidad.geometry.profundidad/2));
				mano.meshCantidad.updateMatrix();
				
				new TWEEN.Tween( mano.meshCantidad.rotation).to( {
					x: mano.meshCantidad.rotation.x ,
					y: mano.meshCantidad.rotation.y  ,
					z: mano.meshCantidad.rotation.z -4*Math.PI
					},
					2000 )
				.easing( TWEEN.Easing.Circular.EaseOut).start();
				
			}

			
			publicacion.meshLike = mano;
			publicacion.meshComentario = comentario;
			
			
			//conjunto: "comentarios" + "cantidad comentarios"
			comentario.addChild(comentario_texto3D);
			comentario.scale = new THREE.Vector3( 0.6, 0.6, 0.6 );
			
			comentario_texto3D.scale = new THREE.Vector3(1/(comentario_texto3D.parent.scale.x)/2, 1/(comentario_texto3D.parent.scale.x)/2, 1/(comentario_texto3D.parent.scale.x)/2 );
			comentario_texto3D.translateX((-comentario.geometry.ancho()/2 - comentario_texto3D.ancho()/2 - separacion));
			comentario_texto3D.translateZ((comentario.alto()));//ver
			comentario_texto3D.translateY((-comentario_texto3D.geometry.profundidad/2));
			comentario_texto3D.updateMatrix();
			
			comentario.anchoTotal = (comentario.ancho() + (comentario_texto3D.ancho()*comentario.scale.x)+ separacion);
			
			
			comentario.meshCantidad = comentario_texto3D;
			comentario.cantidad = publicacion.data.comments.count;
			
			//funcion que actualiza el valor de la cantidad de "me gusta"
			comentario.actualizarCantidad = function(cantidad){
				
				comentario.cantidad = comentario.cantidad + cantidad;
				
				scene.removeChild (comentario.meshCantidad);
				
				comentario.meshCantidad = MESH_BUILDER.getTexto3D(comentario.cantidad);
				comentario.addChild(comentario.meshCantidad);
				
				
				comentario.meshCantidad.scale = new THREE.Vector3(1/(comentario.meshCantidad.parent.scale.x)/2, 1/(comentario.meshCantidad.parent.scale.x)/2, 1/(comentario.meshCantidad.parent.scale.x)/2 );
				comentario.meshCantidad.translateX((-comentario.geometry.ancho()/2 - comentario.meshCantidad.ancho()/2 - separacion));
				comentario.meshCantidad.translateZ((comentario.alto()));//ver
				comentario.meshCantidad.translateY((-comentario.meshCantidad.geometry.profundidad/2));
				comentario.meshCantidad.updateMatrix();
				
				new TWEEN.Tween( comentario.meshCantidad.rotation).to( {
					x: comentario.meshCantidad.rotation.x ,
					y: comentario.meshCantidad.rotation.y  ,
					z: comentario.meshCantidad.rotation.z -4*Math.PI
					},
					2000 )
				.easing( TWEEN.Easing.Circular.EaseOut).start();
				
			}
			
			
			//mergeo los dos subgrupos ("me gusta" + "comentarios")
			anchoGrupo = (mano.anchoTotal + comentario.anchoTotal + separacionGrupos); 
			if (anchoGrupo <= anchoTotalParedon)
			{
				
				mano.translateX( -anchoTotalParedon/2 + (mano.anchoTotal - (mano.geometry.ancho()/2)*mano.scale.x));
				mano.rotation = new THREE.Vector3(Math.PI/2,0,0);
				
				comentario.translateX(-anchoTotalParedon/2 + mano.anchoTotal + separacionGrupos +(comentario.anchoTotal - comentario.geometry.ancho()/2*comentario.scale.x));
				comentario.rotation = new THREE.Vector3(Math.PI/2,0,0);
				
				grupoDataFacebook.addChild(mano);
				grupoDataFacebook.addChild(comentario);
//				grupoDataFacebook.translateX((anchoTotalParedon - anchoGrupo)/2);
				grupoDataFacebook.translateX((anchoTotalParedon - anchoGrupo)/2 + publicacion.mesh[0].geometry.ancho()/2*(publicacion.mesh.length - 1));
				grupoDataFacebook.translateY(publicacion.mesh[0].geometry.alto() + distanciaSupPared);
				
				grupoParedes.addChild(grupoDataFacebook);
				
			}else{
//				alert(mano.anchoTotal);
//				alert(comentario.anchoTotal);
				var grupoMeGusta = new THREE.Object3D();
				mano.rotation = new THREE.Vector3(Math.PI/2,0,0);
				grupoMeGusta.addChild(mano);
				grupoMeGusta.translateX( mano.anchoTotal/2 - mano.ancho()/2);
				
				var grupoComentario = new THREE.Object3D();
				comentario.rotation = new THREE.Vector3(Math.PI/2,0,0);
				grupoComentario.addChild(comentario);
				grupoComentario.translateX( comentario.anchoTotal/2- comentario.ancho()/2);
				grupoComentario.translateY(mano.alto() + 25);
				
				grupoDataFacebook.addChild(grupoMeGusta);
				grupoDataFacebook.addChild(grupoComentario);
				//grupoDataFacebook.translateX( (- Math.min(comentario.anchoTotal, mano.anchoTotal)/2));
				grupoDataFacebook.translateY(publicacion.mesh[0].geometry.alto() + distanciaSupPared);
				
				grupoParedes.addChild(grupoDataFacebook);
			}
			
			
			
			//hacemos a los objetos 'clickeables'
			THREE.Collisions.colliders.push(  THREE.CollisionUtils.MeshColliderWBox(comentario) );
			THREE.Collisions.colliders.push(  THREE.CollisionUtils.MeshColliderWBox(mano) );
			THREE.Collisions.colliders.push(  THREE.CollisionUtils.MeshColliderWBox(persona) );
			
			comentario.publicacion = publicacion;
			mano.publicacion = publicacion;
			persona.publicacion = publicacion;
			
			//-------------- Facebook: "me gusta" y "comentarios"----------------//
			
		
			WEBGL.callbackParedInsertada();
		}
		
 }
 